<html>
    <head>
        <title>IAuditLogScope(审计日志作用域)  和  IAuditingManager(审计日志管理器)</title>
    </head>
    <body>
        <script>
            /*
                        十二、IAuditLogScope 和 IAuditingManager   审计日志作用域  和 审计日志管理器
                                
                                本节介绍用于高级用例的 IAuditLogScope 和 IAuditingManger 服务。

                                “审计日志作用域”是一个环境范围，"构建"并"保存"审计日志对象。
                                默认情况下，审计日志中间件为Web请求创建"审计日志作用域"。


                                1、访问当前审计日志作用域

                                            审计日志贡献者，如上所述，是一种操作审计日志对象的全局方式。
                                            如果你能从服务中获得值，那就太好了。

                                            如果你需要在应用程序的任意点操作审计日对象，你可以访问"当前审计日志作用域"获取当前审计日志对象（与作用域的管理方式无关）

                                            eg:
                                                public class MyService : ITransientDependency
                                                {
                                                    private readonly IAuditingManager _auditingManager;

                                                    public MyService(IAuditingManager auditingManager)
                                                    {
                                                        _auditingManager = auditingManager; // 注入审计日志管理器
                                                    }

                                                    public async Task DoItAsync()
                                                    {
                                                        var currentAuditLogScope = _auditingManager.Current; // 从审计日志管理器获取当前审计日志作用域
                                                        if (currentAuditLogScope != null)
                                                        {
                                                            // 操作审计日志对象，添加备注
                                                            currentAuditLogScope.Log.Comments.Add(
                                                                "Executed the MyService.DoItAsync method :)"
                                                            );
                                                            
                                                            currentAuditLogScope.Log.SetProperty("MyCustomProperty", 42);
                                                        }
                                                    }
                                                }

                                            你应该始终检查 _auditiingManager.Current是否为空，因为它是在外部作用域控制的，
                                            并且在调用方法之前无法知道是否创建了审计作用域。


                                2、手动创建审计日志作用域

                                           你很少需要手动创建审计日志作用域，但是如果需要，你可以使用 IAuditingManager 创建审计日志作用域。
                                           
                                           eg:
                                                public class MyService : ITransientDependency
                                                {
                                                    private readonly IAuditingManager _auditingManager;

                                                    public MyService(IAuditingManager auditingManager)
                                                    {
                                                        _auditingManager = auditingManager; // 注入审计日志管理器
                                                    }

                                                    public async Task DoItAsync()
                                                    {
                                                        // 创建审计日志作用域
                                                        using (var auditingScope = _auditingManager.BeginScope())
                                                        {
                                                            try
                                                            {
                                                                // 调用其他服务
                                                            }
                                                            catch (Exception ex)
                                                            {
                                                                //操作审计日志对象，添加异常信息
                                                                _auditingManager.Current.Log.Exceptions.Add(ex);
                                                                throw;
                                                            }
                                                            finally
                                                            {
                                                                // 一定记得要保存日志
                                                                await auditingScope.SaveAsync();
                                                            }
                                                        }
                                                    }
                                                }

                                        你可以调用其他服务，它们可以调用其他服务，它们可以更改实体等等。所有这些交互都保存为最终块中的单个审计日志对象。
                    */
        </script>
    </body>
</html>